home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / pdftops / xpdf / c++ / Catalog < prev    next >
Text File  |  1996-06-08  |  3KB  |  151 lines

  1. //========================================================================
  2. //
  3. // Catalog.h
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. //#pragma implementation
  11. #endif
  12.  
  13. #include <stddef.h>
  14. #include "gmem.h"
  15. #include "Object.h"
  16. #include "Array.h"
  17. #include "Dict.h"
  18. #include "Page.h"
  19. #include "Error.h"
  20. #include "Catalog.h"
  21.  
  22. //------------------------------------------------------------------------
  23. // Catalog
  24. //------------------------------------------------------------------------
  25.  
  26. Catalog::Catalog(Object *catDict) {
  27.   Object pagesDict;
  28.   Object obj;
  29.   int i;
  30.  
  31.   ok = gTrue;
  32.   pages = NULL;
  33.   pageRefs = NULL;
  34.   numPages = 0;
  35.   if (!catDict->isDict("Catalog")) {
  36.     error(0, "Catalog object is wrong type (%s)", catDict->getTypeName());
  37.     goto err1;
  38.   }
  39.   catDict->dictLookup("Pages", &pagesDict);
  40.   if (!pagesDict.isDict("Pages")) {
  41.     error(0, "Top-level pages object is wrong type (%s)",
  42.       pagesDict.getTypeName());
  43.     goto err2;
  44.   }
  45.   pagesDict.dictLookup("Count", &obj);
  46.   if (!obj.isInt()) {
  47.     error(0, "Page count in top-level pages object is wrong type (%s)",
  48.       obj.getTypeName());
  49.     goto err3;
  50.   }
  51.   numPages = obj.getInt();
  52.   obj.free();
  53.   pages = (Page **)gmalloc(numPages * sizeof(Page *));
  54.   pageRefs = (Ref *)gmalloc(numPages * sizeof(Ref));
  55.   for (i = 0; i < numPages; ++i) {
  56.     pages[i] = NULL;
  57.     pageRefs[i].num = -1;
  58.     pageRefs[i].gen = -1;
  59.   }
  60.   readPageTree(pagesDict.getDict(), NULL, 0);
  61.   pagesDict.free();
  62.   return;
  63.  
  64.  err3:
  65.   obj.free();
  66.  err2:
  67.   pagesDict.free();
  68.  err1:
  69.   ok = gFalse;
  70. }
  71.  
  72. Catalog::~Catalog() {
  73.   int i;
  74.  
  75.   if (pages) {
  76.     for (i = 0; i < numPages; ++i) {
  77.       if (pages[i])
  78.     delete pages[i];
  79.     }
  80.     gfree(pages);
  81.     gfree(pageRefs);
  82.   }
  83. }
  84.  
  85. int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start) {
  86.   Object kids;
  87.   Object kid;
  88.   Object kidRef;
  89.   PageAttrs *attrs1, *attrs2;
  90.   Page *page;
  91.   int i;
  92.  
  93.   attrs1 = new PageAttrs(attrs, pagesDict);
  94.   pagesDict->lookup("Kids", &kids);
  95.   if (!kids.isArray()) {
  96.     error(0, "Kids object (page %d) is wrong type (%s)",
  97.       start+1, kids.getTypeName());
  98.     goto err1;
  99.   }
  100.   for (i = 0; i < kids.arrayGetLength(); ++i) {
  101.     kids.arrayGet(i, &kid);
  102.     if (kid.isDict("Page")) {
  103.       attrs2 = new PageAttrs(attrs1, kid.getDict());
  104.       page = new Page(start+1, kid.getDict(), attrs2);
  105.       if (!page->isOk()) {
  106.     ++start;
  107.     goto err3;
  108.       }
  109.       pages[start] = page;
  110.       kids.arrayGetNF(i, &kidRef);
  111.       if (kidRef.isRef()) {
  112.     pageRefs[start].num = kidRef.getRefNum();
  113.     pageRefs[start].gen = kidRef.getRefGen();
  114.       }
  115.       kidRef.free();
  116.       ++start;
  117.     } else if (kid.isDict("Pages")) {
  118.       if ((start = readPageTree(kid.getDict(), attrs1, start)) < 0)
  119.     goto err2;
  120.     } else {
  121.       error(0, "Kid object (page %d) is wrong type (%s)",
  122.         start+1, kid.getTypeName());
  123.       goto err2;
  124.     }
  125.     kid.free();
  126.   }
  127.   delete attrs1;
  128.   kids.free();
  129.   return start;
  130.  
  131.  err3:
  132.   delete page;
  133.  err2:
  134.   kid.free();
  135.  err1:
  136.   kids.free();
  137.   delete attrs1;
  138.   ok = gFalse;
  139.   return -1;
  140. }
  141.  
  142. int Catalog::findPage(int num, int gen) {
  143.   int i;
  144.  
  145.   for (i = 0; i < numPages; ++i) {
  146.     if (pageRefs[i].num == num && pageRefs[i].gen == gen)
  147.       return i + 1;
  148.   }
  149.   return 0;
  150. }
  151.